package com.tanhua.server.service;

import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.vo.CommentVo;
import com.tanhua.domain.vo.PageResult;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.api.mongo.CommentApi;
import com.tanhua.server.interceptor.UserHolder;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 评论表业务层
 */
@Service
public class CommentService {

    @Reference
    private CommentApi commentApi;
    
    @Reference
    private UserInfoApi userInfoApi;


    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 评论列表
     * movementId:发布id
     */
    public PageResult<CommentVo> queryCommentListByPage(String movementId, int page, int pagesize) {
        PageResult<CommentVo> pageResultVo = new PageResult<>();
        //将List<Comment>转为List<CommentVo>
        List<CommentVo> commentVoList = new ArrayList<>();
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(movementId));//发布id
        comment.setCommentType(2); //评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(1);//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        //根据发布id  针对动态评论 评论操作 查询评论列表
        PageResult<Comment> pageResult = commentApi.queryCommentListByPage(comment,page,pagesize);
        //根据评论用户id 查询 用户信息
        if(pageResult == null || pageResult.getItems() == null || pageResult.getItems().size()==0){
            pageResultVo.setItems(null);
            pageResultVo.setCounts(0l);
            pageResultVo.setPage(0l);
            pageResultVo.setPages(0l);
            pageResultVo.setPagesize(10l);
            return pageResultVo;
        }
        List<Comment> commentList = pageResult.getItems();
        for (Comment cm : commentList) {
            CommentVo commentVo = new CommentVo();
            Long commentUserId = cm.getUserId();//评论用户id
            UserInfo userInfo = userInfoApi.findByUserId(commentUserId);
            BeanUtils.copyProperties(cm,commentVo);
            BeanUtils.copyProperties(userInfo,commentVo);
            //评论时间处理
            commentVo.setCreateDate(new DateTime(comment.getCreated()).toString("yyyy年MM月dd日 HH:mm"));
            //是否点赞 设置默认值
            Long userId = UserHolder.getUserId();
            String key = "comment_like_" + userId + "_" + cm.getId().toHexString();
            if(redisTemplate.hasKey(key)){
                commentVo.setHasLiked(1);
            }else {
                commentVo.setHasLiked(0);
            }
            //设置评论id
            commentVo.setId(cm.getId().toHexString());
            commentVoList.add(commentVo);
        }
        //返回VO
        BeanUtils.copyProperties(pageResult,pageResultVo);
        pageResultVo.setItems(commentVoList);
        return pageResultVo;

    }

    /**
     * 发表评论
     * movementId：发布id  comment：评论内容
     */
    public void postComment(String movementId, String content) {
        Long userId = UserHolder.getUserId();
        //根据发布id  评论内容 封装Comment对象调用save方法
        Comment comment = new Comment();
        comment.setCommentType(2);//评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(1); //评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        comment.setContent(content);//评论内容
        comment.setUserId(userId);//当前登录用户id
        comment.setPublishId(new ObjectId(movementId));//发布id
        commentApi.save(comment);
        //可以不需要返回评论数量（app那边没有处理）
    }

    /**
     * 评论点赞
     * id:评论id
     */
    public Long like(String commentId) {
        Long userId = UserHolder.getUserId();//当前登录用户id
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(commentId));//发布id
        comment.setCommentType(1); //评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(3);//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(userId);//当前登录用户id
        //a.获取当前用户id 发布表动态id 保存评论记录（点赞记录）返回点赞数量
        Long total = commentApi.save(comment);//保存点赞记录
        //d.将点赞记录写入redis  key=commentType+userId+publishId  value=任意值
        String key = "comment_like_" + userId + "_" + commentId;
        redisTemplate.opsForValue().set(key, "true");
        return total;
    }

    /**
     * 评论取消点赞
     * id:评论id
     */
    public Long dislike(String commentId) {
        Long userId = UserHolder.getUserId();//当前登录用户id
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(commentId));//发布id
        comment.setCommentType(1); //评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(3);//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(userId);//当前登录用户id
        //a.获取当前用户id 发布表动态id 保存评论记录（点赞记录）返回点赞数量
        Long total = commentApi.remove(comment);//保存点赞记录
        //d.将点赞记录写入redis
        String key = "comment_like_" + userId + "_" + commentId;
        redisTemplate.delete(key);
        return total;
    }
}
